package com.example.exp3;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class SalesApp {
    // 定义优惠券的数量
    private static final int TOTAL_COUPONS = 10;
    public static void main(String[] args) throws Exception{
        System.out.println("====== 活动开始，共有" + TOTAL_COUPONS + "张优惠券 ======");
        // 模拟多个顾客抢购优惠券
        // 初始化优惠券数量
        SalesCallable.initCoupons(TOTAL_COUPONS);
        // 通过线程池模拟多个顾客
        // ExecutorService executor = Executors.newCachedThreadPool();
        ExecutorService executor = new ThreadPoolExecutor(
                2, //线程池大小
                4,  // 最大线程池大小
                1,  // 线程空闲时间
                TimeUnit.SECONDS,  // 线程空闲时间单位
                new ArrayBlockingQueue<>(1), // 任务队列
                Executors.defaultThreadFactory(),  // 线程工厂
                new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
        );
        // 多个顾客抢购结果放入Future中
        List<Future<Boolean>> futures = new ArrayList<>();
        // 创建多个顾客， 需要不同的顾客ID
        AtomicInteger customerId = new AtomicInteger(0);
        // 模拟多个顾客
        boolean flag = true;//还有优惠券
        while(flag){
            try{
                String customerName = "顾客" + customerId.incrementAndGet();
                // 创建一个新的顾客
                Future<Boolean> future = executor.submit(new SalesCallable(customerName));
                futures.add(future);
                // 判断当前顾客操作是否完成
                if(future.isDone()){
                    flag = future.get();// 返回操作的结果
                }
            }catch(Exception e){
                // 处理无法计算的异常
                System.out.println("当前排队的人数过多，请稍候再试");
                Thread.sleep(50);
            }
        }
        // 关闭线程池
        executor.shutdown();
        // 优雅方式：等待一会，再关闭
        try{
            if(!executor.awaitTermination(1, TimeUnit.MINUTES)){
                executor.shutdownNow();
            }
        }catch(Exception e){
            executor.shutdownNow();
        }

        // 释放连接池对象
        executor.close();

        System.out.println("====== 活动结束，所有优惠券已抢完 ======");
    }
}